#pragma once
#include <iostream>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
const std::string gpath = "/root/review/shm";
int gprojId = 0x6666;
int gshmsize = 4096;
int gmode = 0600;
std::string ToHex(key_t k)
{
    char buffer[64];
    snprintf(buffer,sizeof(buffer),"0x%x",k);
    return buffer;
}
class ShareMemory
{
private:
    void CreateShmHelper(int shmflg)
    {
        _key = ::ftok(gpath.c_str(),gprojId);
        if(_key<0)
        {
            std::cerr<<"ftok error"<<std::endl;
            return;
        }
        _shmid = ::shmget(_key,gshmsize,shmflg);
        if(_shmid<0)
        {
            std::cerr<<"shmget error"<<std::endl;
            return;
        }
        std::cout<<"shmid: "<<_shmid<<std::endl;

    }

public:
    ShareMemory():_shmid(-1),_key(0),_addr(nullptr)
    {}
    ~ShareMemory()
    {}
    void CreateShm()
    {
        if(_shmid==-1)
        {
            CreateShmHelper(IPC_CREAT|IPC_EXCL|gmode);
        }
    }
    void GetShm()
    {
        CreateShmHelper(IPC_CREAT);
    }
    void AttachShm()
    {
        _addr = shmat(_shmid,nullptr,0);//为什么会失败？,0表示默认读写权限
        if((long long)_addr==-1)
        {
            std::cout<<"attach error"<<std::endl;
        }

    }
    void DetachShm()
    {
        if(_addr!=nullptr)
            shmdt(_addr);
        std::cout<<"detach done: "<<std::endl;

    }
    void DeleteShm()
    {
        shmctl(_shmid,IPC_RMID,nullptr);
    }
    void* GetAddr()
    {
        return _addr;
    }
    void ShmMeta()
    {

    }
private:
    key_t _key;
    int _shmid;
    void* _addr;

};

ShareMemory shm;

struct data
{
    char status[32];
    char lasttime[48];
    char image[4000];
};